package game.graph;

import game.model.Juego;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JPanel;

import biblioes.Archivos;

/**
 * Panel con el menu principal del juego. Se lanza al ejecutarse el mismo.
 * Contiene cuatro opciones, nuevo juego, cargar un juego guardado, mostrar
 * los puntajes mas altos y salir.
 * 
 */

public class MenuPpal extends JPanel {

	private static final long serialVersionUID = 1L;

	/**
	 * Constructor del panel.
	 * 
	 */
	
	public MenuPpal() {
		setLayout(null);
		setBackground(Color.white);
		add(nuevoJuego());
		add(cargarJuego());
		add(mostrarPuntajes());
		add(salir());
	}

	/**
	 * Boton para comenzar un nuevo juego.
	 * 
	 * @return JButton el boton con su listener.
	 */
	
	private JButton nuevoJuego() {
		JButton button = new JButton("Nuevo Juego");
		button.setToolTipText("Comienza un juego nuevo");
		button.setBounds(45, 50, 170, 50);
		
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new PideNombre();
			}
		});
		return button;
	}
	
	/**
	 * Boton para cargar un juego guardado.
	 * 
	 * @return JButton el boton con su listener.
	 */
	
	private JButton cargarJuego() {
		JButton button = new JButton("Cargar Juego");
		button.setToolTipText("Comienza un juego guardado");
		button.setBounds(45, 120, 170, 50);

		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser selector = new JFileChooser("./guardados");
				selector.showOpenDialog(MenuPpal.this);
				File archivo = selector.getSelectedFile();
				File dir = new File("./archivos");
				File[] files = dir.listFiles(new FilenameFilter() {
					public boolean accept(File dir, String name) {
						return name.endsWith("." + "txt");
					}
				});
				
				Arrays.sort(files);
				Juego miJuego = new Juego(files);
				
				try {
					if(archivo != null) {
						Archivos.cargarArchivo(miJuego, archivo);
						Integer posicion = posicionCargada(files, miJuego.verNivel());
						if(posicion == null) {
							throw new IOException();
						}
						miJuego.setNivelActual(posicion + 1);
						new TableroFrame(miJuego);
					}
				} catch (IllegalArgumentException e1) {
					String mensaje = "<html>El archivo de nivel contiene" +
									 "<br>valores no adecuados.</html>";
					new MensajeFrame(mensaje);
				} catch (Exception e1) {
					String mensaje = "<html>El archivo seleccionado no corresponde a<br>" +
									 "una partida guardada</html>";
					new MensajeFrame(mensaje);
				}
			}
		});
		return button;
	}
	
	/**
	 * Boton para mostrar mejores puntajes.
	 * 
	 * @return JButton el boton con su listener.
	 */
	
	private JButton mostrarPuntajes() {
		JButton button = new JButton("Mejores puntajes");
		button.setToolTipText("Muestra los mejores puntajes");
		button.setBounds(45, 190, 170, 50);

		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					new MostrarPuntajes();
			}
		});
		return button;
	}
	
	/**
	 * Boton para salir del juego.
	 * 
	 * @return JButton el boton con su listener.
	 */
	
	private JButton salir() {
		JButton button = new JButton("Salir");
		button.setToolTipText("Sale del juego");
		button.setBounds(45, 260, 170, 50);

		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		return button;		
	}
	
	/**
	 * Esta funcion recibe un array de File, que representa los niveles del
	 * directorio de partidas, y un nombre, que representa el nombre del nivel que 
	 * se carga de las partidas guardadas.
	 * Esta funcion retorna un entero que representa la posicion del nivel en ese array.
	 * Se utiliza para saber que nivel continua despeus del cargado.
	 * 
	 * @param files array con los niveles del directorio de niveles.
	 * @param nombre nombre del nivel cargado.
	 * @return Integer entero con la posicion o null si no existiera.
	 * 
	 */
	
	private Integer posicionCargada(File[] files, String nombre) {
		for(int i = 0; i < files.length; i++) {
			if(files[i].getName().equals(nombre + ".txt")) {
				return i;
			}
		}
		return null;
	}
	
}
